home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 361_01 / askbox.c < prev    next >
C/C++ Source or Header  |  1991-09-18  |  3KB  |  95 lines

  1.  
  2. /* AskBox.c --> A "Stacked Window" Simulation via Direct Video Writes.
  3.  *
  4.  * Author: J.Ekwall                                     13 September 91
  5.  *
  6.  * Copyrighted to the Public Domain.  Unlimited Distribution Authorized.
  7.  *
  8.  * User Assumes All Risks/Liabilities.
  9.  *
  10.  * Last Update: 16 September 91/EK
  11.  */
  12.  
  13. #include <ctype.h>
  14. #include <stdlib.h>
  15. #include <stdek.h>
  16. #include <gadgets.h>
  17.  
  18. void Box(int Left, int Top, int Right, int Bottom, int Fill, int Color)
  19. /* Draw a single line box using Color & Clear it to Fill. */
  20. {
  21.     int i;
  22.     char Lid[81];
  23.  
  24.     Dwrite(Left, Top, Color, "┌"); Dwrite(Right, Top, Color, "┐");
  25.     Dwrite(Left, Bottom, Color, "└"); Dwrite(Right, Bottom, Color, "┘");
  26.     *Lid = NULL; PadRight(Lid, '─', Right - Left - 1);
  27.     Dwrite(Left+1, Top, Color, Lid); Dwrite(Left+1, Bottom, Color, Lid);
  28.     for (i= Top + 1; i < Bottom; i++) {
  29.         Dwrite(Left, i, Color, "│"); Dwrite(Right,      i, Color, "│"); }
  30.     ClrBox(++Left, ++Top, --Right, --Bottom, Fill);
  31. }
  32.  
  33. void CcolorSet(int X, int Y, int Color, int N)
  34. { while (N--) if (Y < 26) SetAttr(X, Y++, Color); }
  35.  
  36. void MkAskBox(char *FootPrint, int X, int Y, int Width, int Tall, char Shadow,
  37.     char *TopTitle, char *FootTitle, char *Prompt, BYTE Color)
  38. {
  39.     int Xc, Xsh, Xg, Y1, X1;
  40.  
  41.  /* Handle Shadow */
  42.     X1 = X + Width - 1; Y1 = Y + Tall - 1; Xg = Xsh = X;
  43.     if (Y+Tall > 25);
  44.     else if (Shadow IS 'L' && X > 1)   { Xsh--; Xg--; Y1++; }
  45.     else if (Shadow IS 'R' && X < 80)  { Xsh++; X1++; Y1++; }
  46.  
  47.  /* Build Window w/ Titles */
  48.     HideCursor(); if (FootPrint != NULL) SaveBox(Xg, Y, X1, Y1, FootPrint);
  49.     Box(X, Y, (X1 = X+Width-1), (Y1 = Y+Tall-1), Color, Color);
  50.     if (Shadow) MkShadow(X, Y, X1, Y1, Shadow);
  51.     if (*TopTitle) Dwrite(X+(Width-strlen(TopTitle)+1)/2, Y, Color, TopTitle);
  52.     if (*FootTitle)
  53.        Dwrite (X+(Width-strlen(FootTitle)+1)/2, Y1, Color, FootTitle);
  54.     if (*Prompt) Dwrite(X+1, Y+1, Color, Prompt); else Gotoxy(X+1, Y+1);
  55.     ShowCursor(0);
  56. }
  57.  
  58. void MkShadow(int Left, int Top, int Right, int Bottom, char Which1)
  59. /* Create the illusion of a shadow under the specified window */
  60. {
  61.     int X, Y, Z;
  62.  
  63.     if (++Bottom > 25) return;
  64.     if (Which1 IS 'L' && --Right && --Left < 1) return;
  65.     if (Which1 != 'L' && ++Left && ++Right > 80) return;
  66.     if ((Z = Bottom - Top++) < 1) return;
  67.     if (Which1 IS 'L') CcolorSet(Left, Top, 0, Z);
  68.     else CcolorSet(Right, Top, 0, Z);
  69.     if ((Z = Right - Left + 1) > 0) RcolorSet(Left, Bottom, 0, Z);
  70. }
  71.  
  72. void RcolorSet(int X, int Y, int Color, int N)
  73. {
  74.     int addr;
  75.  
  76.     Color <<= 8;
  77.     for (addr = Vaddr(X, Y); N--; addr += 2)
  78.         Vpoke(addr, (Vpeek(addr) & 0xFF) + Color);
  79. }
  80.  
  81. void ZapAskBox(char *FootPrint,int X,int Y,int Width,int Tall,char Shadow)
  82. {
  83.     int X1, Y1;
  84.  
  85.  /* Handle Shadow */
  86.     X1 = X + Width - 1; Y1 = Y + Tall - 1;
  87.     if (Y+Tall > 25);
  88.     else if (Shadow IS 'L' && X > 1)   { X--;  Y1++; }
  89.     else if (Shadow IS 'R' && X < 80)  { X1++; Y1++; }
  90.  
  91.  /* Zap Window */
  92.     HideCursor(); RestoreBox(X, Y, X1, Y1, FootPrint);
  93. }
  94.  
  95.